package com.photon.phresco.aws;
import java.util.ArrayList;
import java.util.Collection;
import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.autoscaling.AmazonAutoScaling;
import com.amazonaws.services.autoscaling.AmazonAutoScalingClient;
import com.amazonaws.services.autoscaling.model.CreateAutoScalingGroupRequest;
import com.amazonaws.services.autoscaling.model.CreateLaunchConfigurationRequest;
import com.amazonaws.services.autoscaling.model.PutScalingPolicyRequest;
import com.amazonaws.services.autoscaling.model.PutScalingPolicyResult;
import com.amazonaws.services.cloudwatch.AmazonCloudWatch;
import com.amazonaws.services.cloudwatch.AmazonCloudWatchClient;
import com.amazonaws.services.cloudwatch.model.PutMetricAlarmRequest;
public class AWSAutoScaleHelper {
public String accessKey;
public String secretKey;
public String autoScaleName;
public String instanceType;
public String imageId;
public String securityGroup;
public String keyPair;
public Collection<String> availabilityZones;
public String userData;
public int minSize;
public int maxSize;
public int desiredSize;
public String loadBalancer;
public String scaleUpStatistic;
public String scaleUpMetric;
public String scaleUpNamespace;
public int scaleUpEvalPeriods;
public int scaleUpPeriod;
public String scaleUpComparison;
public double scaleUpThreshold;
public String scaleUpUnit;
public String scaleUpAdjustmentType;
public int scaleUpAdjustment;
public int scaleUpCooldown;
public String scaleDownStatistic;
public String scaleDownMetric;
public String scaleDownNamespace;
public int scaleDownEvalPeriods;
public int scaleDownPeriod;
public String scaleDownComparison;
public double scaleDownThreshold;
public String scaleDownUnit;
public String scaleDownAdjustmentType;
public int scaleDownAdjustment;
public int scaleDownCooldown;
public void setupAutoScaling() {
// TODO validate that all necessary member variables have been set
if(desiredSize <= minSize || desiredSize >= maxSize)
desiredSize = minSize;
AWSCredentials creds = new BasicAWSCredentials(accessKey, secretKey);
try {
AmazonAutoScaling autoScaling = new AmazonAutoScalingClient(creds);
//Launch configuration
String launchConfigName = "Phresco-LC-" + autoScaleName;
CreateLaunchConfigurationRequest launchConfigRequest = new CreateLaunchConfigurationRequest()
.withLaunchConfigurationName(launchConfigName)
.withInstanceType(instanceType).withImageId(imageId)
.withKeyName(keyPair).withSecurityGroups(securityGroup)
.withUserData(userData);
autoScaling.createLaunchConfiguration(launchConfigRequest);
//Auto scaling group
String autoScalingGroupName = "Phresco-ASG-" + autoScaleName;
CreateAutoScalingGroupRequest autoScalingGroupRequest = new CreateAutoScalingGroupRequest()
.withAutoScalingGroupName(autoScalingGroupName)
.withAvailabilityZones(availabilityZones)
.withLaunchConfigurationName(launchConfigName)
.withMinSize(minSize)
.withMaxSize(maxSize)
.withDesiredCapacity(desiredSize);
if (!isBlank(loadBalancer)) {
ArrayList<String> lbs = new ArrayList<String>();
lbs.add(loadBalancer);
autoScalingGroupRequest.setLoadBalancerNames(lbs);
}
autoScaling.createAutoScalingGroup(autoScalingGroupRequest);
//Scale up policy
String scaleUpPolicyName = "Phresco-Pol-Up-" + autoScaleName;
PutScalingPolicyRequest scaleUpPolicyRequest = new PutScalingPolicyRequest()
.withPolicyName(scaleUpPolicyName)
.withAutoScalingGroupName(autoScalingGroupName)
.withScalingAdjustment(scaleUpAdjustment)
.withAdjustmentType(scaleUpAdjustmentType)
.withCooldown(scaleUpCooldown);
PutScalingPolicyResult scaleUpPolicyResult = autoScaling.putScalingPolicy(scaleUpPolicyRequest);
AmazonCloudWatch cloudWatch = new AmazonCloudWatchClient(creds);
//Scale up alarm
String upAlarmName = "Phresco-Pol-UpAlarm-" + autoScaleName;
PutMetricAlarmRequest upAlarmRequest = new PutMetricAlarmRequest()
.withAlarmName(upAlarmName)
.withEvaluationPeriods(scaleUpEvalPeriods)
.withPeriod(scaleUpPeriod)
.withComparisonOperator(scaleUpComparison)
.withMetricName(scaleUpMetric)
.withNamespace(scaleUpNamespace)
.withStatistic(scaleUpStatistic)
.withThreshold(scaleUpThreshold)
.withUnit(scaleUpUnit)
.withAlarmActions(scaleUpPolicyResult.getPolicyARN());
cloudWatch.putMetricAlarm(upAlarmRequest);
//Scale down policy
String scaleDownPolicyName = "Phresco-Pol-Dn-" + autoScaleName;
PutScalingPolicyRequest scaleDownPolicyRequest = new PutScalingPolicyRequest()
.withPolicyName(scaleDownPolicyName)
.withAutoScalingGroupName(autoScalingGroupName)
.withScalingAdjustment(scaleDownAdjustment)
.withAdjustmentType(scaleDownAdjustmentType)
.withCooldown(scaleDownCooldown);
PutScalingPolicyResult scaleDownPolicyResult = autoScaling.putScalingPolicy(scaleDownPolicyRequest);
//Scale down alarm
String downAlarmName = "Phresco-Pol-DnAlarm-" + autoScaleName;
PutMetricAlarmRequest downAlarmRequest = new PutMetricAlarmRequest()
.withAlarmName(downAlarmName)
.withEvaluationPeriods(scaleDownEvalPeriods)
.withPeriod(scaleDownPeriod)
.withComparisonOperator(scaleDownComparison)
.withMetricName(scaleDownMetric)
.withNamespace(scaleDownNamespace)
.withStatistic(scaleDownStatistic)
.withThreshold(scaleDownThreshold)
.withUnit(scaleDownUnit)
.withAlarmActions(scaleDownPolicyResult.getPolicyARN());
cloudWatch.putMetricAlarm(downAlarmRequest);
} catch (AmazonServiceException ase) {
ase.printStackTrace();
} catch (AmazonClientException ace) {
ace.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}
private static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}